package com.zxl.security.core.social.qq.connect;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.social.oauth2.AccessGrant;
import org.springframework.social.oauth2.OAuth2Template;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;

import java.nio.charset.Charset;

@Slf4j
public class QQOAuth2Template extends OAuth2Template {
    private String accessTokenUrl;

    public QQOAuth2Template(String clientId, String clientSecret, String authorizeUrl, String accessTokenUrl) {
        super(clientId, clientSecret, authorizeUrl, accessTokenUrl);
        /** 默认发送clientId和ClientSecret是使用head去发送的，
         * 具体实现是使用拦截器PreemptiveBasicAuthClientHttpRequestInterceptor去发送，
         * 这里我们去设置*/
        setUseParametersForClientAuthentication(true);// 设置true，这样发请求的时候才能带上appId和appSecret
        this.accessTokenUrl = accessTokenUrl;
    }

    @Override
    protected AccessGrant postForAccessGrant(String accessTokenUrl, MultiValueMap<String, String> parameters) {
        /**
         * 这里因为QQ返回的access_token相关信息是
         * access_token=xxx&expires_in=7776000&refresh_token=xxx
         * 需要我们重写方法进行处理，默认的实现是处理返回json数据格式的，这里QQ返回的是字符串格式
         */
        return getAccessGrant(accessTokenUrl, parameters);
    }

    private AccessGrant getAccessGrant(String accessTokenUrl, MultiValueMap<String, String> parameters) {
        String result = getRestTemplate().getForObject(accessTokenUrl, String.class, parameters);
        log.info("获取的QQ返回的access_token返回信息 = " + result);
        String[] split = result.split("[&]");
        String accessToken = StringUtils.substringAfterLast(split[0], "=");
        Long expiresIn = Long.parseLong(StringUtils.substringAfterLast(split[1], "="));
        String refreshToken = StringUtils.substringAfterLast(split[2], "=");
        return new AccessGrant(accessToken, null, refreshToken, expiresIn);
    }

    @Override
    public AccessGrant refreshAccess(String refreshToken, MultiValueMap<String, String> additionalParameters) {
        return getAccessGrant(accessTokenUrl, additionalParameters);
    }

    @Override
    protected RestTemplate createRestTemplate() {
        RestTemplate restTemplate = super.createRestTemplate();
        // 添加String返回的处理转化器，因为QQ返回的信息是String类型的，默认的转化器没有处理字符串返回的
        restTemplate.getMessageConverters().add(new StringHttpMessageConverter(Charset.forName("UTF-8")));
        return restTemplate;
    }
}
